/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package analisadorSemantico;

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import modelo.Constante;
import modelo.ErroSemantico;
import modelo.Procedimento;
import modelo.Programa;
import modelo.TipoIdentificador;
import modelo.Token;
import modelo.Variavel;
import modelo.tipos.TipoVariavel;

/**
 *
 * @author DEP
 */
public class TabelaDeSimbolos {

    private Map<String, TipoIdentificador> simbolos;

    public TabelaDeSimbolos() {
        super();
        simbolos = new LinkedHashMap<>();
    }

    public boolean foramDeclaradas(Set<Token> s) {
        for (Token t : s) {
            if (foiDeclarada(t.getToken())) {
                return true;
            }
        }
        return false;
    }

    public boolean foiDeclarada(String chave) {
        return simbolos.keySet().contains(chave);
    }

    public TipoIdentificador get(String chave) {
        return simbolos.get(chave);
    }

    public void criarTodasVariaveis(Set<Token> tokens, TipoVariavel t, String escopo, int linha) throws ErroSemantico {
        try {
            for (Token identificador : tokens) {
                criarVariavel(identificador.getToken(), t,escopo, linha);
            }
        } catch (NullPointerException ex) {
            throw new ErroSemantico() {
                public String errosToString() {
                    return "Erro interno.";
                }
            };
        }

    }

    public void criarPrograma(String chave, String escopo, int linha) {
        simbolos.put(chave, new Programa(chave, linha, escopo));
    }

    public void criarProcedimento(Procedimento procedimento, String nome) {
        procedimento.setEscopo(nome);
        simbolos.put(procedimento.getNome(), procedimento);
    }

    public void criarVariavel(String chave, TipoVariavel tipo, String escopo, int linha) {

        simbolos.put(chave, new Variavel(tipo, escopo, linha));

    }

    public void criarConstante(String chave, TipoVariavel tipo, String escopo, int linha) {

        simbolos.put(chave, new Constante(tipo, escopo, linha));

    }

    public Map<String, TipoIdentificador> getSimbolos() {
        return simbolos;
    }
}
